﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Callchecker
{
    /// <summary>
    /// Задаваемые параметры (настройки)
    /// </summary>
    [Serializable]
    public class ProgramSettings
    {
        #region Общедоступные статические методы

        /// <summary>
        /// Загружается экземпляр класса. Синглетон
        /// </summary>
        public static ProgramSettings Item
        {
            get
            {
                if (_item == null)
                {
                    lock (_syncRoot)
                    {
                        if (_item == null)
                            _item = new ProgramSettings();
                    }
                }
                return _item;
            }

        }
        
        /// <summary>
        /// Загружает из файла настроек данные и инициализирует ими поля класса. Является синглетоном
        /// </summary>
        public static void Load()
        {
            object obj = CallCheckSerialize.Deserialize(Common.SETTING_PATH);
            if (obj != null)
            {
                ProgramSettings.Item.ActivatedAlarm = ((ProgramSettings)obj).ActivatedAlarm;
                ProgramSettings.Item.DurationOfInterval = ((ProgramSettings)obj).DurationOfInterval;
                ProgramSettings.Item.Interval = ((ProgramSettings)obj).Interval;
                ProgramSettings.Item.MySqlAliase = ((ProgramSettings)obj).MySqlAliase;
                ProgramSettings.Item.Server = ((ProgramSettings)obj).Server;
                ProgramSettings.Item.Port = ((ProgramSettings)obj).Port;
                ProgramSettings.Item.TypeConnection = ((ProgramSettings)obj).TypeConnection;
                ProgramSettings.Item.DatabaseName = ((ProgramSettings)obj).DatabaseName;
                ProgramSettings.Item.MySqlPassword = ((ProgramSettings)obj).MySqlPassword;
                ProgramSettings.Item.NormalMissedCall = ((ProgramSettings)obj).NormalMissedCall;
                ProgramSettings.Item.SqlString = ((ProgramSettings)obj).SqlString;
                ProgramSettings.Item.StartOnLoad = ((ProgramSettings)obj).StartOnLoad;
                ProgramSettings.Item.TimeShift = ((ProgramSettings)obj).TimeShift;
                ProgramSettings.Item.StartOnLoadOS = ((ProgramSettings)obj).StartOnLoadOS;
            }
        }

        /// <summary>
        /// Текущее состояние полей экземпляра класса сохраняется в файле Common.SETTING_PATH
        /// </summary>
        public static void Save()
        {
            CallCheckSerialize.Serialize(Common.SETTING_PATH, ProgramSettings.Item);
        }


        #endregion

        #region Constructors

        private ProgramSettings() { }
        private static ProgramSettings _item;
        private static object _syncRoot = new Object();

        #endregion

        #region Поля

        /// <summary>
        /// Периодичность опроса (мин.)
        /// </summary>
        public int Interval;

        /// <summary>
        /// Длительность проверяемого интервала (мин.)
        /// </summary>
        public int DurationOfInterval;

        /// <summary>
        /// Нормальный уровень пропущенных вызовов (вызов/мин.)
        /// </summary>
        public int NormalMissedCall;

        /// <summary>
        /// Опция воспроизведения звукового сигнала
        /// </summary>
        public bool ActivatedAlarm;

        /// <summary>
        /// Опция запуска сервера запросов при старте программы
        /// </summary>
        public bool StartOnLoad;

        /// <summary>
        /// Смещение по времени для запроса
        /// </summary>
        public int TimeShift;

        /// <summary>
        /// Опция запуска прогаммы при старте windows
        /// </summary>
        public bool StartOnLoadOS;

        #region Настройки соединения с базой
        
        /// <summary>
        /// Сервер базы данных
        /// </summary>
        public string Server;
        
        /// <summary>
        /// Порт сервера баз данных
        /// </summary>
        public uint Port;
        
        /// <summary>
        /// Тип соединения
        /// </summary>
        public string TypeConnection;

        /// <summary>
        /// Имя базы данных
        /// </summary>
        public string DatabaseName;

        /// <summary>
        /// Логин пользователя
        /// </summary>
        public string MySqlAliase;

        /// <summary>
        /// Пароль пользователя
        /// </summary>
        public string MySqlPassword;

        #endregion

        // Настройка запросов к базе
        public List<string> SqlString = new List<string>();

        #endregion
    }
}
